package com.yzr.common.util;

import com.yzr.common.constants.ServiceConstants;
import com.yzr.common.exception.BaseException;
import com.yzr.common.exception.IllegalFileException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;

/**
 * @description
 * @author: yx-0173
 * @date: 2021-06-28 17:11
 **/
public class FileCheck {

    public static final String SUFFIX_REGULAR = "\\.";
    public static final String XLS = "xls";
    public static final String XLSX = "xlsx";

    /**
     * 校验文本文件是否是恶意
     *
     * @param file 文件
     * @return boolean
     * @throws BaseException 自定义异常
     */
    public static boolean isMalicious(File file) throws BaseException, IllegalFileException {
        ParamCheck.getFileCheck(file, "文件不存在");
        String name = file.getName();
        ParamCheck.getStringCheck(name, "文件名为空");
        if (!name.contains(ServiceConstants.SUFFIX)) {
            return true;
        }
        return name.split(SUFFIX_REGULAR).length > 2;
    }

    /**
     * 校验文本文件是否是恶意
     *
     * @param file 文件
     * @return boolean
     * @throws BaseException 自定义异常
     */
    public static boolean isMalicious(MultipartFile file) throws BaseException, IllegalFileException {
        ParamCheck.getEntityCheck(file, "文件为空");
        String filename = file.getOriginalFilename();
        ParamCheck.getStringCheck(filename, "文件名为空");
        if (!filename.contains(ServiceConstants.SUFFIX)) {
            return true;
        }
        return filename.split(SUFFIX_REGULAR).length > 2;
    }

    /**
     * 校验文件是否是xx类型文件
     *
     * @param file 文件
     * @return boolean
     * @throws BaseException 自定义异常
     */
    public static boolean isTypeOf(File file, String... type) throws BaseException, IllegalFileException {
        if (isMalicious(file)) {
            throw new IllegalFileException("文件为恶意文件");
        }
        ParamCheck.getArrayCheck(type, "文件类型为空");
        ParamCheck.getStringCheck(file.getName(), "文件名称为空");
        String[] split = file.getName().split(SUFFIX_REGULAR);
        if (type.length == 1) {
            return split[1].equals(type[0]);
        }
        for (String t : type) {
            if (split[1].equals(t)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 校验文件是否是xx类型文件
     *
     * @param file 文件
     * @return boolean
     * @throws BaseException 自定义异常
     */
    public static boolean isTypeOf(MultipartFile file, String... type) throws BaseException, IllegalFileException {
        if (isMalicious(file)) {
            throw new IllegalFileException("文件为恶意文件");
        }
        ParamCheck.getArrayCheck(type, "文件类型为空");
        ParamCheck.getStringCheck(file.getOriginalFilename(), "文件名称为空");
        String[] split = file.getOriginalFilename().split(SUFFIX_REGULAR);
        if (type.length == 1) {
            return split[1].equals(type[0]);
        }
        for (String t : type) {
            if (split[1].equals(t)) {
                return true;
            }
        }
        return false;
    }

    public static String fileType(String fileName) throws IllegalFileException {
        if (!fileName.contains(ServiceConstants.SUFFIX)) {
            throw new IllegalFileException("文件名没有后缀名");
        }
        String[] split = fileName.split(SUFFIX_REGULAR);
        if (split.length > 2) {
            throw new IllegalFileException("文件包含多个后缀，不符合文件命名规则");
        }
        return split[1];
    }

    /**
     * 校验文件是否是sls/xlsx类型文件
     *
     * @param file 文件
     * @return boolean
     * @throws BaseException 自定义异常
     */
    public static boolean isExcelType(File file) throws BaseException, IllegalFileException {
        return isTypeOf(file, XLS, XLSX);
    }

    /**
     * 校验文件是否是sls/xlsx类型文件
     *
     * @param file 文件
     * @return boolean
     * @throws BaseException 自定义异常
     */
    public static boolean isExcelType(MultipartFile file) throws BaseException, IllegalFileException {
        return isTypeOf(file, XLS, XLSX);
    }

}

